/**
 * 找图的工具类, 实现花式找图的功能
 */

/**
 * 在当前页面的截图中找图
 * @param {*} imageName 图片名称, 只需要文件名即可, 会去resources\images这个目录下找
 * @param {*} threshold 相似度
 * @returns 找到的图片坐标点
 */
function findImageInCapture(imageName, threshold) {
    const absolutePath = getImageAbsolutePath(imageName)
    console.error('---toFindImagePath: ', absolutePath)
    var toFindImage = images.read(absolutePath)
    console.error('---toFindImage: ', toFindImage)
    if (!toFindImage) {
        console.error('未找到要对比的图片资源文件')
    }
    // 截图并找图
    var point = findImage(captureScreen(), toFindImage, {
        region: [0, 0], // 从点 [0, 0] 找到屏幕的右下角
        threshold: threshold || 0.5 // 相似度
    })
    if (point) {
        console.error('找到目标: ' + point)
    } else {
        console.error('未找到目标')
    }
    return point
}

/**
 * 找到图片并点击
 * @param {*} imageName
 * @param {*} threshold
 * @param {*} isCenter 是否点击图片的中心
 */
function findImageClick(imageName, threshold, isCenter) {
    const absolutePath = getImageAbsolutePath(imageName)
    console.error('---toFindImagePath: ', absolutePath)
    var toFindImage = images.read(absolutePath)
    console.error('---toFindImage: ', toFindImage)
    if (!toFindImage) {
        console.error('未找到要对比的图片资源文件')
    }
    // 截图并找图
    var point = findImage(captureScreen(), toFindImage, {
        region: [0, 0], // 从点 [0, 0] 找到屏幕的右下角
        threshold: threshold || 0.5 // 相似度
    })
    if (point) {
        console.error('找到目标: ' + point)
        if (isCenter) {
            click(point.x, point.y)
        } else {
            let x = toFindImage.getWidth() / 2
            let y = toFindImage.getHeight() / 2
            click(point.x + x, point.y + y)
        }
        return true
    } else {
        console.error('未找到目标')
        return false
    }
}

/**
 * 具有重试机制的找图
 * @param {*} imageName 图像
 * @param {*} threshold 相似度
 * @param {*} awaitSecond 重试延时
 * @param {*} retryNum 重试次数
 * @param {*} x x偏移
 * @param {*} y y偏移
 * @returns 
 */
function findImageClickWait(imageName, threshold, awaitSecond, retryNum, x, y) {
    if(retryNum === 0) {
        console.error('未找到目标')
        return false
    }
    if(!x) {
        x = 0
    }
    if(!y) {
        y = 0
    }
    const absolutePath = getImageAbsolutePath(imageName)
    console.error('---toFindImagePath: ', absolutePath)
    var toFindImage = images.read(absolutePath)
    console.error('---toFindImage: ', toFindImage)
    if (!toFindImage) {
        console.error('未找到要对比的图片资源文件')
    }
    // 截图并找图
    var point = findImage(captureScreen(), toFindImage, {
        region: [0, 0], // 从点 [0, 0] 找到屏幕的右下角
        threshold: threshold || 0.5 // 相似度
    })
    if (point) {
        console.error('找到目标: ' + point)
        click(point.x + x, point.y + y)
        return true
    } else {
        console.error('未找到目标, 稍后重试')
        return findCommonImageClick(imageName, threshold, awaitSecond, retryNum - 1)
    }
}

/**
 * 获取一个图片对象
 * @param {*} imageName 图片名称, 只需要文件名即可, 会去resources\images这个目录下找
 * @returns
 */
function getImage(imageName) {
    const absolutePath = getImageAbsolutePath(imageName)
    console.error('---toFindImagePath: ', absolutePath)
    var toFindImage = images.read(absolutePath)
    console.error('---toFindImage: ', toFindImage)
    return toFindImage
}

/**
 * 寻找通用的可点击按钮, 执行点击操作
 */
function findCommonImageClick() {
    // 跳过按钮
    const skipPos = findImageInCapture('common/skip.png')
    if (skipPos) {
        click(skipPos.x, skipPos.y)
    }
    // 同意按钮
    const acceptPos = findImageInCapture('common/accept.png')
    if (acceptPos) {
        click(acceptPos.x, acceptPos.y)
    }
    // 关闭按钮
    const closePos = findImageInCapture('common/close.png')
    if (closePos) {
        click(closePos.x, closePos.y)
    }
    // 点击屏幕继续按钮
    // const goonPos = findImageInCapture('common/goon.png')
    // if (goonPos) {
    //  click(goonPos.x, goonPos.y)
    // }
    // 升级
    // const upPos = findImageInCapture('common/upPos.png')
    // if (upPos) {
    //     click(upPos.x, upPos.y)
    // }
}

/**
 * 获取当前屏幕截图
 */
function captureCurrentScreen() {
    return captureScreen()
}

/**
 * 在指定图片中寻找模板并返回位置
 */
function findTemplateImgInSource(source, template, threshold) {
    const absolutePath = getImageAbsolutePath(template)
    var toFindImage = images.read(absolutePath)
    if (!toFindImage) {
        console.error('未找到要对比的图片资源文件')
    }
    return images.findImage(source, toFindImage, {
        region: [0, 0], // 从点 [0, 0] 找到屏幕的右下角
        threshold: threshold || 0.5// 相似度
    })
}

function imageClip(imageName, x, y, width, height) {
    const absolutePath = getImageAbsolutePath(imageName)
    let src = images.read(absolutePath)
    let ext = files.getExtension(absolutePath)
    let clip = images.clip(src, x, y, width, height)
    images.save(clip, getImageAbsolutePath(imageName + '_clip.' + ext))
}

function getWorkDir() {
    const configStorage = storages.create('config')
    return configStorage.get('workDir')
}

function getImageAbsolutePath(imageName) {
    const workDir = getWorkDir() || files.cwd()
    return `${workDir}/resources/images/${imageName}`
}


function init() {
    return {
        findImageInCapture,
        imageClip,
        getWorkDir,
        getImageAbsolutePath,
        getImage,
        findImageClick,
        findCommonImageClick,
        captureCurrentScreen,
        findTemplateImgInSource,
        findImageClickWait
    }
}

init()
